////////////////#include<iostream>
////////////////#include<unordered_set>
////////////////using namespace std;
////////////////int main()
////////////////{
////////////////	unordered_set<char> mp;
////////////////	char ch;
////////////////	while (cin >> ch)
////////////////	{
////////////////		mp.insert(ch);
////////////////	}
////////////////	string s1;bool flag = 1;
////////////////	for (auto  v : mp)
////////////////	{
////////////////		int i = 1;
////////////////		s1[i] = v;
////////////////		i++;
////////////////	}
////////////////	int la = s1.size();cout << la;
////////////////	/*for (int i = 1; i <= la; i++)
////////////////	{
////////////////		if (s1[i] == 'h' && s1[i + 1] == 'e' && s1[i + 2] == 'l'
////////////////			&& s1[i + 3] == 'l' && s1[i + 4] == 'o')
////////////////		{
////////////////			flag = 0;
////////////////			cout << "YES" << endl;
////////////////			break;
////////////////		}
////////////////	}
////////////////	cout << s1;
////////////////	if (flag == 1) cout << "NO" << endl;*/
////////////////	return 0;
////////////////}
//////////////#include<iostream>
//////////////#include<string>
//////////////using namespace std;
//////////////int st[26];
//////////////int main()
//////////////{
//////////////	char ch;string s1 = "";
//////////////	while (cin >> ch)
//////////////	{
//////////////		st[ch - 'a']++;
//////////////		switch (ch)
//////////////		{
//////////////		case 'h':if (st['h' - 'a'] == 1)s1 += 'h';break;
//////////////			if (st['h' - 'a'] == 1)
//////////////			{
//////////////		case 'e':if (st['e' - 'a'] == 1)s1 += 'e';break;
//////////////		case  'l': if (st['l' - 'a'] <= 2)s1 += 'l';break;
//////////////		case 'o':if (st['o' - 'a'] == 1)s1 += 'o';break;
//////////////			}
//////////////		}
//////////////	}
//////////////	if (s1 == "hello") cout << "YES" << endl;
//////////////	else cout << "NO" << endl;
//////////////	return 0;
//////////////}
//////////////#include<iostream>
//////////////#include<unordered_map>
//////////////using namespace std;
//////////////int main()
//////////////{
//////////////	unordered_map<char, int>mp;
//////////////}
////////////#include<iostream>
////////////#include<stack>
////////////using namespace std;
////////////stack<char> mp;
////////////int main()
////////////{
////////////	string s1;cin >> s1;
////////////	int la = s1.size();
////////////	for (int i = la - 1; i >= 0; i--)
////////////	{
////////////		if(s1[i] == 'o')
////////////
////////////	}
////////////	return 0;
////////////}
//////////#include<string>
//////////#include<iostream>
//////////#include<unordered_map>
//////////using namespace std;
//////////int main()
//////////{
//////////	unordered_map<char, int> mp;string s1;
//////////	char ch;
//////////	while (cin >> ch)
//////////	{
//////////		mp[ch]++;
//////////		switch (ch)
//////////		{
//////////		case 'h':if (mp['h'] == 1) s1 += "h";break;
//////////		case 'e':if (mp['e'] == 1)s1 += 'e';break;
//////////		case 'l':if (mp['l'] <= 2)s1 += 'l';break;
//////////		case'o':if (mp['o'] == 1)s1 += 'o';break;
//////////		}
//////////	}
//////////	if (s1 == "hello") cout << "YES" << endl;
//////////	else cout << "NO" << endl;
//////////	return 0;
//////////}
//////////#define _CRT_SECURE_NO_WARNINGS
//////////#include<stdio.h>
//////////int main()
//////////{
//////////	int a[11];
//////////	int n = 10, pos;
//////////	for (int i = 0; i < 10; i++)
//////////	{
//////////		scanf("%d", &a[i]);
//////////	}
//////////	int k;scanf("%d", &k);
//////////	pos = n + 1;
//////////	for (int i = 0; i < 10; i++)
//////////	{
//////////		if (a[i] > k)
//////////		{
//////////			pos = i;
//////////			break;
//////////		}
//////////	}
//////////	for (int i = n - 1; i >= pos; i--)
//////////	{
//////////		a[i + 1] = a[i];
//////////	}
//////////	a[pos] = k;
//////////	for (int i = 0; i <= 10; i++)
//////////	{
//////////		printf("%d ", a[i]);
//////////	}
//////////	return 0;
//////////}
//////////#include<iostream>
//////////#include<string>
//////////using namespace std;
//////////int st[26];
//////////int main()
//////////{
//////////	string s1;cin >> s1;
//////////	int la = s1.size();
//////////	for (int i = 0; i < la; i++)
//////////	{
//////////		st[s1[i] - 'a'] = 1;
//////////		if (st['h' - 'a'] == 1)
//////////		{
//////////
//////////		}
//////////	}
//////////	return 0;
//////////}
////////#include<iostream>
////////#include<unordered_set>
////////using namespace std;
////////int main()
////////{
////////	string s1, s2;char ch;
////////	unordered_set<char> mp;
////////	while (cin >> ch)
////////	{
////////		mp.insert(ch);
////////	}
////////	for (auto v : mp)
////////	{
////////		s1 += v;
////////	}
////////	cout << s1 << endl;
////////	if (s1.find("hello")) cout << "YES" << endl;
////////	else cout << "NO" << endl;
////////	return 0;
////////}
//////#include<iostream>
//////#include<string>
//////using namespace std;
//////int st[26];
//////int main()
//////{
//////	string s1, s2;char ch;
//////	while (cin >> ch)
//////	{
//////		st[ch - '0']++;
//////		if (st['h' - 'a'] == 1) s1 += 'h';
//////		else if (st['e' - 'a'] == 1) s1 += 'e';
//////		else if (ch == 'l' && st['l' - 'a'] <= 2) s1 += ch;
//////		else  if (st['o' - 'a'] == 1) s1 += 'o';
//////	}
//////	if (s1 == "hello") cout << "YES";
//////	else  cout << "NO";
//////	return 0;
//////}
//////#include<iostream>
//////#include<string>
//////using namespace std;
//////int main()
//////{
//////	string s1, s2;cin >> s1;
//////	int la = s1.size();
//////	for (int i = 0; i < la; i++)
//////	{
//////		for (int j = i; j < la; j++)
//////		{
//////
//////		}
//////	}
//////	return 0;
//////}
//////#include<iostream>
//////using namespace std;
//////int main()
//////{
//////	int a, b, c;cin >> a >> b >> c;
//////	int t1 = a + b * c;
//////	int t2 = a * b * c;
//////	int t3 = a * b + c;
//////	int t4 = (a + b) * c;
//////	int t5 = a + b + c;
//////	int t6 = a * (b + c);
//////	
//////	cout << max(t6,max(t5,max(t4, max(t3, max(t1, t2)))));
//////
//////	return 0;
//////}
////#include<iostream>
////#include<string>
////using namespace std;
////bool fin(int u)
////{
////	string s1 = to_string(u);
////	int la = s1.size();
////	for (int i = 0; i < la; i++)
////	{
////		if (s1[i] != '4' && s1[i] != '7') return false;
////	}
////	return true;
////}
////int main()
////{
////	int a[] = { 4,7,44,47,74,77,444,777,474,447,744,747,774,777 };
////	int sz = sizeof(a) / sizeof(a[0]);
////	string s1, s2;
////	int x;cin >> x;
////	for (int i = 0; i < sz; i++)
////	{
////		if (x % a[i] == 0)
////		{
////			cout << "YES" << endl;
////			return 0;
////		}
////	}
////	if (x % 7 == 0 || x % 4 == 0) cout << "YES" << endl;
////	else if (fin(x)) cout << "YES" << endl;
////	else cout << "NO";
////	return 0;
////}     iiillllsfhello
//#include<iostream>
//#include<string>
//using namespace std;
//int main()
//{
//	string s1;cin >> s1;
//	int la = s1.size();
//	int l1 = s1.find('h');
//	int l2 = s1.find('e');
//	int l3 = s1.find("l");
//	return 0;
//}
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
int st[26];
int main()
{
	stack<char> mp;string s1;
	char ch;
	while (cin >> ch)
	{
		mp.push(ch);
	}
	while (!mp.empty())
	{
		char a = mp.top();mp.pop();
		st[a - 'a']++;
		if (a == 'o' && st['o' - 'a'] == 1)
		{
			s1 += 'o';
		}
		else if (a == 'l' && st['l' - 'a'] <= 2)
		{
			s1 += 'l';
		}
		else if (a == 'e' && st['e' - 'a'] == 1)
		{
			s1 += 'e';
		}
		else if (a == 'h' && st['h' - 'a'] == 1)
		{
			s1 += 'h';
		}
	}
	reverse(s1.begin(), s1.end());
	if (s1 == "hello") cout << "YES";
	else cout << "NO";
	return 0;
}